package com.huaxin.hxenum.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import com.huaxin.hxenum.base.BaseCodeEnum;

/**
 * 比较操作符枚举 (Comparison Operator)
 * 用于定义报警阈值、条件判断等场景的比较逻辑
 */
public enum ComparisonOperator implements BaseCodeEnum<String> {

    /**
     * 大于 (Greater Than)
     * value > threshold
     */
    GREATER_THAN("gt", ">"),

    /**
     * 小于 (Less Than)
     * value < threshold
     */
    LESS_THAN("lt", "<"),

    /**
     * 大于等于 (Greater Than Or Equal)
     * value >= threshold
     */
    GREATER_THAN_OR_EQUAL("gte", ">="),

    /**
     * 小于等于 (Less Than Or Equal)
     * value <= threshold
     */
    LESS_THAN_OR_EQUAL("lte", "<="),

    /**
     * 等于 (Equal)
     * value == threshold
     */
    EQUAL("eq", "=="),

    /**
     * 不等于 (Not Equal)
     * value != threshold
     */
    NOT_EQUAL("ne", "!="),

    /**
     * 在范围内 (In Range)
     * minValue < value < maxValue
     * 需要同时提供 min 和 max 阈值
     */
    RANGE("range", "在范围内"),

    /**
     * 范围外 (Outside Range)
     * value < minValue OR value > maxValue
     * 需要同时提供 min 和 max 阈值
     */
    OUTSIDE_RANGE("outside_range", "范围外");

    @EnumValue
    private final String code;
    private final String displayName;

    ComparisonOperator(String code, String displayName) {
        this.code = code;
        this.displayName = displayName;
    }

    @JsonValue
    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getDisplayName() {
        return displayName;
    }

    /**
     * 根据 code 获取对应的枚举实例
     *
     * @param code 操作符代码 (如 "gt", "lt", "range")
     * @return 对应的 ComparisonOperator 枚举，如果未找到则返回 null
     */
    public static ComparisonOperator of(String code) {
        for (ComparisonOperator op : values()) {
            if (op.getCode().equalsIgnoreCase(code)) {
                return op;
            }
        }
        return null;
    }

    /**
     * 判断指定的 code 是否为有效的比较操作符
     *
     * @param code 待验证的代码
     * @return true 表示是有效的操作符
     */
    public static boolean isValid(String code) {
        return of(code) != null;
    }

    /**
     * 判断该操作符是否需要两个阈值 (min 和 max)
     *
     * @return true 表示需要两个阈值
     */
    public boolean requiresTwoThresholds() {
        return this == RANGE || this == OUTSIDE_RANGE;
    }

    /**
     * 判断该操作符是否只需要一个阈值
     *
     * @return true 表示只需要一个阈值
     */
    public boolean requiresSingleThreshold() {
        return !requiresTwoThresholds();
    }

    /**
     * 检查给定的数值是否满足当前操作符和阈值条件
     * (这是一个示例方法，实际业务中可能在Service层实现更复杂的逻辑)
     *
     * @param value          当前监测值
     * @param thresholdValue 单值阈值 (用于 GREATER_THAN 等)
     * @param minThreshold   最小阈值 (用于 RANGE)
     * @param maxThreshold   最大阈值 (用于 RANGE)
     * @return true 表示触发条件
     */
    public boolean evaluate(double value, Double thresholdValue, Double minThreshold, Double maxThreshold) {
        return switch (this) {
            case GREATER_THAN -> value > thresholdValue;
            case LESS_THAN -> value < thresholdValue;
            case GREATER_THAN_OR_EQUAL -> value >= thresholdValue;
            case LESS_THAN_OR_EQUAL -> value <= thresholdValue;
            case EQUAL -> value == thresholdValue;
            case NOT_EQUAL -> value != thresholdValue;
            case RANGE -> value > minThreshold && value < maxThreshold;
            case OUTSIDE_RANGE -> value < minThreshold || value > maxThreshold;
            default -> throw new UnsupportedOperationException("不支持的操作符: " + this);
        };
    }
}